package 泛型.反射;

/**
 * 潜在类型机制： 不同的类型，有相同的接口。
 * 例如： 这个类，看起来像是鸭子，走起来像是鸭子，吃起来也是鸭子。 而我们只是用到了他的这几种API，那么我就可以认为他是鸭子类型。
 * 具体点说，这几个类型，都有着相同的两个接口:speak() sit()
 * 我们可以利用反射来实现潜在类型机制的补偿
 */

import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class Mime {
	public void walkAgainstTheWind() {
	}

	public void sit() {
		System.out.println("pretending to sit");
	}

	public void pushInvisibleWalls() {
	}

	@Override
	public String toString() {
		return "Mime";
	}
}

class SmartDog {
	public void speak() {
		System.out.println("woof");
	}

	public void sit() {
		System.out.println("sitting");
	}

	public void reproduce() {
	}
}

class CommunicateReflectively {
	public static void perform(Object speaker) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
		Class<?> spkr = speaker.getClass();
		Method speak = spkr.getMethod("speak");
		speak.invoke(speaker);
		Method sit = spkr.getMethod("sit");
		sit.invoke(speaker);
	}
}

public class LatenReflection {
	public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, AWTException {
		CommunicateReflectively.perform(new SmartDog());
		//CommunicateReflectively.perform(new Robot());
		CommunicateReflectively.perform(new Mime());
	}
}
